var { existsSync, readFileSync } = require('fs');
module.exports = function subpackagesAlias(options) {
	let entries = {};
	let extnameOPtions = [];
	options.map(item => {
		// 根据分包名称，对别名和文件类型分组
		entries[item.subPackagesName] = item.alias;
		extnameOPtions[item.subPackagesName] = item.extnameOPtions;
	});
	return {
		name: 'subpackages-alias',
		resolveId(importee, importer) {
			for (let key in entries) {
				// 根据文件导入这所在目标，区分所在分包
				if (importer.indexOf(key) > 0 && entries[key].length > 0) {
					// 替换该分包下所设置的别名
					const aliasEntry = entries[key].find((entry) => importee.startsWith(entry.find));
					if (aliasEntry) {
						const aliasedPath = importee.replace(aliasEntry.find, aliasEntry.replacement); return hasIndexFile(extnameOPtions[key], aliasedPath)
					}

				}
			}
		},
	};
};

// 处理隐式调用的情况
function hasIndexFile(extnameOPtions, aliasedPath) {
	// 显式引用
	// hello/hello.js
	if (/\.\w+$/.test(aliasedPath)) {
		return aliasedPath
	} else {
		let extname = '';
		// 隐式引用 x.js/ts
		// hello.js
		extname = extnameOPtions.find(item => existsSync(aliasedPath + `.${item}`));
		if (extname) {
			return aliasedPath + `.${extname}`
		}
		// 隐式引用 index.x
		// hello/index.js
		extname = extnameOPtions.find(item => existsSync(aliasedPath + `/index.${item}`));
		if (extname) {
			return aliasedPath + `/index.${extname}`
		}
		// 隐式引用 x.x
		// hello/hello.js
		extname = extnameOPtions.find(item => existsSync(aliasedPath +
			`/${aliasedPath.split('/').at(-1)}.${item}`));
		if (extname) {
			return aliasedPath + `/${aliasedPath.split('/').at(-1)}.${extname}`
		}
		// 如果有package.json文件
		extname = extnameOPtions.find(item => existsSync(aliasedPath + `/package.json`));
		if (extname) {
			const packageJsonPath = aliasedPath + `/package.json`;
			const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
			if (packageJson.main) {
				return aliasedPath + `/${packageJson.main}`
			}
		}
	}
}
